package cn.tearcry.jsudoku;
/*
 * GridButton.java
 *
 * Created on 2007年 下午8:23 
 *
 * 界面显示的数字按钮
 * 
 */

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
/**
 *
 * @author 马建乐
 */
public class GridButton extends JButton implements ActionListener,MouseListener{
    
    /** 按钮所在的行 */
    private int row;
    /** 按钮所在的列 */
    private int column;  
    /** 按钮的动作 */
    private  ButtonAction btnAction;    
    /** 按钮上的数字 */
    private int num;
    /** 是否被用户标上数字 */
    private boolean userHasFill=false;
    /** 按钮是否被系统标上数字 */
    private boolean puzzleFill=false;
    /** 按钮初始颜色 */
    public final  static Color oriColor=new Color(220,230,237);
    /** 初始化标志 */
    private boolean initNum=false;
    private MouseListener mListener;
    
    
    
    
    /**
     * 获得按钮所在的行
     * @return 按钮所在的行
     */
    public int getRow() {
        return row;
    }
    
    
    /**
     * 获得按钮所在的行
     * @return 按钮所在的列
     */
    public int getColumn() {
        return column;
    }
    
    
    
        
    /**
     * 创建一个GridButton对象 相关数据初始化为0
     * @param row 格子所在的行
     * @param column 格子所在的列
     */
    public GridButton(int row,int column) {
      super();
      puzzleFill=true;
      this.row=row;
      this.column=column;    
      setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0) , 1));  
      setBackground(new Color(220,230,237));
    
     
    }
    
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        if(enabled) {
             addActionListener(this);
             addMouseListener(this);
        }
        else {
            this.removeActionListener(this);
            this.removeMouseListener(this);
        }
    }
    
    /**
     * 设置按钮回调的动作
     * @param ButtonAction  按钮执行的动作
     */
    public void addButtonAction(ButtonAction btnAction) {
        this.btnAction=btnAction;
    }
    
    
   /**
     * 获得当前格子设置的数
     * @return 当前格子设置的数
     */    
    public int getNum() {
        if(userHasFill||puzzleFill)
            return num;
        else
            return 0;
    }
    
    /**
     * 当前格子是否被系统填入数字
     * @return 是否被系统填入数字
     */  
    public boolean isPuzzleFill() {
        return puzzleFill;
    }
    
     /**
     * 设置初始化数字开始
     * 初始置数字时打开，初始化完毕后关�?
     * @param boolean 是否开始初始化
     */  
    public void startInit(boolean start) {
        initNum=start;
    }
            
    public void setNum(int num) {
        if(num>9||num<0) 
            return;
            
            if(0==num) {
                super.setText (""); 
                this.num=0;
                puzzleFill=false;
                userHasFill=false;
            }
            else {
                //系统置数为黑色 用户置数为蓝色
                super.setText ("<html><font size='6' color='"+(puzzleFill?"BLACK":"BLUE")+"'><B><center>"+
                        num+"</B></center></font></html>");
              
                //如果是初始化
                if(initNum) {              
                puzzleFill=true;
                userHasFill=false;
                }
                else {
                    userHasFill=true;
                    puzzleFill=false;
                }
                this.num=num;
              
            }
       
    }
    
    public void removeNum() {
        //如果没有被标记过 则返�?
        if(!userHasFill)
            return;        
        setText("");
        userHasFill=false;
    }
    
    public void clear() {         
                 
         userHasFill=false;
         puzzleFill=true;
    }
    
    public boolean isUserHasFill() {
        return userHasFill;
    }
    /**
     * 按钮执行的动�?调用action接口中的方法 
     */
    public void actionPerformed(ActionEvent e) {
        if(null==btnAction)         
            return;        
        btnAction.doSomething();      
        
    }
    /** 空方法存根 */
    public void mouseClicked(MouseEvent e) {
    }

    public void mousePressed(MouseEvent evt) {
     btnAction.rightButtonAction (evt);
    }
    
    /** 空方法存根 */
    public void mouseReleased(MouseEvent e) {
    }
    /** 空方法存根 */
    public void mouseEntered(MouseEvent e) {
    }
    /** 空方法存根 */
    public void mouseExited(MouseEvent e) {
    }
}
